package com.demo.tankGame05;

import java.io.*;
import java.util.Vector;

/**
 * 该类用于记录相关信息，和文件交互
 * @author gy
 * @date 2022/5/2
 */
public class Recorder {
    /**
     * 定义变量，所有的被我方击毁的坦克数量
     */
    private static int allEnemyTankNum = 0;
    /**
     * 定义IO对象，准备写数据到文件中
     */
    private static FileWriter fw = null;
    private static BufferedWriter bw = null;
    /**
     * 记录文件的位置
     */
    private static String recordFile = "20220428-tankGame03-study/src/main/resources/myRecord.txt";

    /**
     * 定义Vector ,指向 MyPanel 对象 的 敌人坦克的 Vector
     */
    private static Vector<EnemyTank> enemyTanks = null;

    /**
     * 定义 Vector<Node> 用于存放保存了的 敌方坦克信息
     */
    private static Vector<Node> nodes = new Vector<>();

    /**
     * 需要 一个 输入流,读取文件中的内容
     */
    private static BufferedReader br = null;

    public static String getRecordFile() {
        return recordFile;
    }

    /**
     * 用于读取 recordFile，恢复相关信息
     * 敌方坦克记录、敌方坦克数量
     */
    public static Vector<Node> getNodesAndEnemyTankNum(){

        try {
            br = new BufferedReader(new FileReader(recordFile));
            // 将读取到第一行的 敌人坦克数量的 值 恢复
            allEnemyTankNum = Integer.parseInt(br.readLine());
            // 循环读取剩余文件内容，生成 nodes 集合
            String line = ""; // 160 81 2
            while ((line = br.readLine()) != null){
                // 通过 空格 分割获取 node对象的属性值
                String[] xyd = line.split(" ");
                int x = Integer.parseInt(xyd[0]);
                int y = Integer.parseInt(xyd[1]);
                int d = Integer.parseInt(xyd[2]);
                Node node = new Node(x, y, d);
                // 将每个 node 对象交给 Vector<Node> 进行管理
                nodes.add(node);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if(br != null){
                    br.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return nodes;
    }

    /**
     * 拿到MyPanel 对象中 敌人的坦克集合，在MyPanel对象 合适的位置，将数据传送过来
     * @param enemyTanks
     */
    public static void setEnemyTanks(Vector<EnemyTank> enemyTanks) {
        Recorder.enemyTanks = enemyTanks;
    }

    /**
     * 当游戏退出时，我们将allEnemyTankNum 保存到 recordFile
     * @return
     */
    public static void keepRecord(){
        try {
            bw = new BufferedWriter(new FileWriter(recordFile));
            // 写入数据，并换行
            bw.write(allEnemyTankNum + "\r\n");

            // 遍历敌人的坦克Vector，然后更具情况保存即可
            // OOP，定义一个属性，然后通过setXXX 得到，敌人坦克的Vector
            for (int i = 0; i < enemyTanks.size(); i++) {
                // 取出敌人的坦克对象
                EnemyTank enemyTank = enemyTanks.get(i);
                if(enemyTank.isLive){
                    // 将敌人坦克的 坐标、方向 记录下来，写入到文件
                    bw.write(enemyTank.getX() +" "+ enemyTank.getY() +" "+ enemyTank.getDirect());
                    // 换行记录
                    bw.newLine();
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(bw != null){
                try {
                    bw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static int getAllEnemyTankNum() {
        return allEnemyTankNum;
    }

    public static void setAllEnemyTankNum(int allEnemyTankNum) {
        Recorder.allEnemyTankNum = allEnemyTankNum;
    }

    /**
     * 当我方击毁敌方的坦克后，allEnemyTankNum ++
     */
    public static void addAllEnemyTankNum(){
        Recorder.allEnemyTankNum++;
    }
}
